home *** CD-ROM | disk | FTP | other *** search
/ Magnum One / Magnum One (Mid-American Digital) (Disc Manufacturing).iso / d12 / v9n08.arc / TPFST-AT.ASM < prev    next >
Assembly Source File  |  1990-03-30  |  6KB  |  135 lines

  1. ;----------------------------------------------------;
  2. ;  TPFST-AT * PC Magazine * Michael J. Mefford       ;
  3. ;  Keyboard acceleration that takes advantage        ;
  4. ;  of the special BIOS services of the AT and PS/2.  ;
  5. ;----------------------------------------------------;
  6.  
  7. _TEXT          SEGMENT PUBLIC 'CODE'
  8.                ASSUME  CS:_TEXT,DS:_TEXT
  9.  
  10.                ORG     100H
  11. START:         JMP     MAIN
  12.  
  13. ;              DATA AREA
  14. ;              ---------
  15. SIGNATURE      DB      CR,SPACE,SPACE,SPACE,CR,LF
  16.  
  17. COPYRIGHT      DB      "TPFST-AT 1.0 (c) 1989 Ziff Communications Co.",CR,LF
  18. PROGRAMMER     DB      "PC Magazine ",BOX," Michael J. Mefford",CR,LF,LF,"$"
  19.  
  20. SYNTAX         DB      "Syntax:  TPFST-AT [m,n | N]",CR,LF
  21.                DB      "m = typematic rate (0 - 31); larger m = faster rate"
  22.                DB      CR,LF
  23.                DB      "n = initial delay  (0 - 3);  larger n = longer delay"
  24.                DB      CR,LF
  25.                DB      "N=normal: m = 20; n = 1",CR,LF
  26.                DB      "default:  m = 27; n = 0",CR,LF,LF,"$"
  27.                DB      CTRL_Z
  28.  
  29. BAD_PARAMETER  DB      "Invalid parameter",CR,LF,LF,BELL,"$"
  30.  
  31. CR             EQU     13
  32. LF             EQU     10
  33. COMMA          EQU     ","
  34. CTRL_Z         EQU     26
  35. SPACE          EQU     32
  36. BOX            EQU     254
  37. BELL           EQU     7
  38.  
  39. REPEAT_MAX     EQU     31
  40. REPEAT_NORMAL  EQU     REPEAT_MAX - 20
  41. REPEAT_DEFAULT EQU     27
  42. INIT_MAX       EQU     3
  43. INIT_NORMAL    EQU     1
  44. INIT_DEFAULT   EQU     0
  45.  
  46. ;              CODE AREA
  47. ;              ---------
  48.  
  49. MAIN           PROC    NEAR
  50.  
  51.                CLD                             ;All string operations forward.
  52.  
  53.                MOV     DX,OFFSET SIGNATURE     ;Display signature.
  54.                CALL    PRINT_STRING
  55.  
  56.                MOV     SI,81H                  ;Point to parameters.
  57. FIND_PARA:     LODSB
  58.                CMP     AL,CR
  59.                JZ      FOUND_END
  60.                CMP     AL,SPACE
  61.                JBE     FIND_PARA
  62. FOUND_END:     DEC     SI
  63.  
  64. TYPEMATIC:     MOV     BL,REPEAT_NORMAL        ;Assume normal parameters.
  65.                MOV     BH,INIT_NORMAL
  66.                MOV     AL,BYTE PTR [SI]
  67.                AND     AL,5FH
  68.                CMP     AL,"N"                  ;Is it (N)ormal request?
  69.                JZ      SET_TYPE                ;If yes, assumed right.
  70.                CALL    DECIMAL_INPUT           ;Get requested typematic rate.
  71.                MOV     BL,REPEAT_DEFAULT       ;Assume no parameter.
  72.                JZ      STORE_REPEAT            ;If none, use default.
  73.                MOV     BL,AL                   ;Else, rate in BL.
  74.                CMP     BL,REPEAT_MAX           ;Is it greater than max rate?
  75.                JA      ERROR_EXIT              ;If yes, exit with error.
  76. STORE_REPEAT:  NEG     BL                      ;Inverse rate by subtracting
  77.                ADD     BL,REPEAT_MAX           ; from maximum rate.
  78.                CALL    DECIMAL_INPUT           ;Get requested initial delay.
  79.                MOV     BH,INIT_DEFAULT         ;Assume no parameter.
  80.                JZ      SET_TYPE                ;If none, use default.
  81.                MOV     BH,AL                   ;Else, delay in BL.
  82.                CMP     BH,INIT_MAX             ;Is it greater than max delay?
  83.                JA      ERROR_EXIT              ;If yes, exit with error.
  84. SET_TYPE:      MOV     AX,305H                 ;Set typematic rate and delay
  85.                INT     16H                     ; via BIOS.
  86.                XOR     AL,AL                   ;ErrorLevel = 0.
  87.                JMP     SHORT EXIT              ;Done here.
  88.  
  89. ERROR_EXIT:    MOV     DX,OFFSET BAD_PARAMETER ;Display error message.
  90.                CALL    PRINT_STRING
  91.                MOV     AL,1                    ;ERRORLEVEL = 1.
  92.  
  93. EXIT:          PUSH    AX                      ;Preserve ERRORLEVEL.
  94.                MOV     DX,OFFSET SYNTAX        ;Display syntax message.
  95.                CALL    PRINT_STRING
  96.                POP     AX                      ;Retrieve ERRORLEVEL.
  97.                MOV     AH,4CH                  ;Terminate.
  98.                INT     21H
  99.  
  100. MAIN           ENDP
  101.  
  102. ;----------------------------------------------------------------------;
  103. ; INPUT:  SI -> string;                                                ;
  104. ; OUTPUT: SI -> end of string; AX = number; ZF = 1 if no number found. ;
  105. ;----------------------------------------------------------------------;
  106. DECIMAL_INPUT: PUSH    BX
  107.                XOR     BX,BX                   ;Start with zero as number.
  108.                XOR     BP,BP                   ;Number found flag.
  109. NEXT_DECIMAL:  LODSB                           ;Get a character.
  110.                SUB     AL,"0"                  ;ASCII to binary.
  111.                JC      DECIMAL_END             ;If not between 0 and 9, skip.
  112.                CMP     AL,9
  113.                JA      DECIMAL_END
  114.                CBW                             ;Convert byte to word.
  115.                XCHG    AX,BX                   ;Swap old and new number.
  116.                MOV     CX,10                   ;Shift to left by multiplying
  117.                MUL     CX                      ; last entry by ten.
  118.                ADD     BX,AX                   ;Add new number and store in BX.
  119.                INC     BP
  120.                JMP     NEXT_DECIMAL
  121. DECIMAL_END:   DEC     SI                      ;SI -> string end.
  122.                MOV     AX,BX
  123.                OR      BP,BP                   ;Number found flag.
  124.                POP     BX
  125.                RET
  126.  
  127. ;--------------------------;
  128.  
  129. PRINT_STRING:  MOV     AH,9                    ;Print string via DOS.
  130.                INT     21H
  131.                RET
  132.  
  133. _TEXT          ENDS
  134.                END     START
  135.